parser grammar AnalizadorFlexParser;

options {
  language = Java;
  tokenVocab = AnalizadorFlexLexer;
}

@header{package PL.practica5;}

@members{

ArrayList <RecognitionException> errores = new ArrayList<RecognitionException>();

public boolean listaVacia (){
    if (errores.isEmpty()){
      return true;
    }else
      return false;
}


public ArrayList getListaErrores(){return errores;}


@Override
public void reportError (RecognitionException e){
  System.err.println (getErrorMessage(e, getTokenNames()));
  errores.add(e);
}


}


flex : bloque1 bloque2 bloque3;

bloque1 : macro macro bloqueDeclaracion;
  //macro : (IDENT CORCHETES)*;
  macro : IDENT CORCHETES;
  bloqueDeclaracion: ABRIRVARIABLES declaracion declaracion CERRARVARIABLES;

  declaracion : TIPO ASTERISCO? IDENT SEPARADOR;
    //declaracion : (TIPO IDENT SEPARADOR)+;
    //bloque2: reglasflex;
    //reglasflex : (VARIABLEFLEX*
    //(ABRIRPARENTESIS VARIABLEFLEX (OPERADORLOGICOS VARIABLEFLEX)* CERRARPARENTESIS (ASTERISCO|SUMA)?)*
    //(IDENT INCREMENTO|DECREMENTO) SEPARADOR)+;
bloque2 : SEPARADORBLOQUE reglaflex1 reglaflex2 SEPARADORBLOQUE;
	reglaflex1 : (VARIABLEFLEX*
	(ABRIRPARENTESIS VARIABLEFLEX (OPERADORLOGICOS VARIABLEFLEX)* CERRARPARENTESIS (ASTERISCO|SUMA)?)*
	(IDENT INCREMENTO|DECREMENTO) SEPARADOR);
	reglaflex2 : VARIABLEFLEX* (IDENT INCREMENTO|DECREMENTO) SEPARADOR;


bloque3 : metodo1 metodo2;
	metodo1: cabecerafuncion ABRIRLLAVE ret CERRARLLAVE;
	metodo2: cabecerafuncion ABRIRLLAVE asignacion asignacion asignacion decrementar
  llamadafuncion SEPARADOR llamadafuncion SEPARADOR printf printf  ret CERRARLLAVE;
  decrementar : DECREMENTO IDENT SEPARADOR;
  //bloque3 : metodo*;
  // metodo : cabecerafuncion ABRIRLLAVE  ((asignacion|printf|llamadafuncion)SEPARADOR)* ret  CERRARLLAVE;
		parametros : (ASTERISCO? IDENT CORCHETES*) | CADENA |NUMERO; 
		cabecerafuncion : (TIPO | VOID) IDENT ABRIRPARENTESIS ((VOID |TIPO IDENT) (COMA TIPO parametros)*)? CERRARPARENTESIS;
		llamadafuncion : IDENT ABRIRPARENTESIS ( parametros (COMA parametros)*)? CERRARPARENTESIS;
		//printf :  PRINTF ABRIRPARENTESIS CADENA (COMA IDENT)* CERRARPARENTESIS ;
		printf :  PRINTF ABRIRPARENTESIS CADENA (COMA IDENT)* CERRARPARENTESIS SEPARADOR;
		//asignacion : IDENT IGUAL (parametros | llamadafuncion);
	asignacion : IDENT IGUAL (parametros | llamadafuncion) SEPARADOR;
		ret : RETORNAR (NUMERO|IDENT|CADENA)? SEPARADOR;



